package chjob

import (
	"fmt"
)

// 1、求n的阶乘。至少使用递归函数完成一次
func Ch03_01_01(n int) int {
	k := 1
	switch {
	case n < 0:
		fmt.Println("请输入大于0的正整数")
		return -1
	case n == 0:
		return 0
	case n == 1:
		return 1
	}
	for i := 2; i <= n; i++ {
		k *= i
	}
	return k
}

// 递归公式版本
func Ch03_01_02(n int) int {
	switch {
	case n < 0:
		fmt.Println("请输入大于0的正整数")
		return -1
	case n == 0:
		return 0
	case n == 1:
		return 1
	}
	// f(n) = n * n-1 * ... * 1
	return n * Ch03_01_02(n-1)
}

// 循环改递归版
func Ch03_01_03(n int, m int) int {
	switch {
	case n < 0:
		fmt.Println("请输入大于0的正整数")
		return -1
	case n == 0:
		return 0
	case n == 1:
		return m
	}
	return Ch03_01_03(n-1, m*n)
}

// 2、编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐
func num_seq(n int) string {
	num_str := ""
	for i := n; i >= 1; i-- {
		if i == 1 {
			num_str += fmt.Sprintf("%d", i)
		} else {
			num_str += fmt.Sprintf("%d ", i)
		}
	}
	return num_str
}

func Ch03_02(n int) {
	for i := 1; i <= n; i++ {
		length := len(num_seq(n)) - len(num_seq(i))
		fmt.Printf("%*s", length, "")
		fmt.Printf("%s\n", num_seq(i))
	}
}

// 3、简述defer作用和应用
/*
作用：defer在函数执行完之后返回之前执行，函数执行到defer后会先注册，多个defer返回顺序是按照后注册先执行的顺序，defer后面必须是一个函数或方法的调用
应用:可以应用与函数执行完后解互斥锁、关闭打开的文件或关闭连接，达到释放资源的目的，也可以捕获错误在函数返回前进行处理。
*/
